﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DBSynchronize
{
    /// <summary>
    /// Расширение класса Customers
    /// </summary>
    public partial class Customers
    {
        /// <summary>
        /// Возвращает юридическое лицо клиента по названию
        /// </summary>
        /// <param name="legalEntityName">Название юридического лица</param>
        /// <returns>Юридическое имя</returns>
        public LegalEntities GetLegalEntityByName(string legalEntityName)
        {
            foreach (LegalEntities legalEntity in LegalEntities)
            {
                if (legalEntity.Name == legalEntityName)
                    return legalEntity;
            }

            return null;
        }


        /// <summary>
        /// Список адресов клиента
        /// </summary>
        public List<Addresses> Addresses
        {
            get
            {
                return LegalEntities.SelectMany(legalEntity => legalEntity.Addresses).ToList();
            }
        }

        /// <summary>
        /// Добавление оборудования клиенту
        /// </summary>
        /// <param name="eq2add">Оборудование для добавления</param>
        /// <param name="userId">Логин пользователя, который собирается добавить</param>
        public void AddEquipment(CustomersEquipments eq2add, string userId)
        {
            DB.CustomersEquipmentInsert(eq2add, userId);
        }

        /// <summary>
        /// Контакты клиенты - только чтение
        /// </summary>
        public List<Contacts> Contacts
        {
            get
            {
                var result = new List<Contacts>();
                foreach (LegalEntities legalEntity in LegalEntities.Where(p => p.IsActive))
                {
                    foreach (Contacts contact in legalEntity.Contacts)
                    {
                        result.Add(contact);
                    }
                }
                return result;
            }
        }

        /// <summary>
        /// Является ли клиент дилером
        /// </summary>
        public bool IsDealer
        {
            get { return true; }
        }

        /// <summary>
        /// Удаление юридического лица
        /// </summary>
        /// <param name="legalEntities">Юридическое лицо</param>
        public void RemoveLegalEntity(LegalEntities legalEntities)
        {
            LegalEntities le = LegalEntities.Single(p => p.IdLegalEntity == legalEntities.IdLegalEntity);
            DB.Entities.LegalEntities.DeleteObject(le);
            DB.Entities.SaveChanges();
        }

        /// <summary>
        /// Добавление контакта к юридическому лицу
        /// </summary>
        /// <param name="contact">Контакт</param>
        /// <param name="idLeggalEntity">Идентификатор юридического лица</param>
        /// <param name="userLogin">Логин пользователя</param>
        public void AddContact(Contacts contact, int idLeggalEntity, string userLogin)
        {
            LegalEntities le = LegalEntities.FirstOrDefault(p => p.IdLegalEntity == idLeggalEntity);
            contact.IdLegalEntity = idLeggalEntity;
            contact.IdUser = userLogin;
            if (!le.Contacts.Contains(contact))
                le.Contacts.Add(contact);
            DB.Entities.SaveChanges();
        }

        /// <summary>
        /// Обороты клиента
        /// </summary>
        public List<Turnovers> Turnovers
        {
            get
            {
                var result = new List<Turnovers>();

                foreach (LegalEntities legalEntity in LegalEntities)
                {
                    foreach (Turnovers turnover in legalEntity.Turnovers)
                    {
                        result.Add(turnover);
                    }
                }
                return result;
            }
        }


        /// <summary>
        /// Удаление оборудования
        /// </summary>
        /// <param name="item">Оборудование для удаления</param>
        public void RemoveEquipment(CustomersEquipments item)
        {
            DB.Entities.CustomersEquipments.DeleteObject(
                DB.CustomersEquipments.FirstOrDefault(p => p.IdCustomersEquipments == item.IdCustomersEquipments));
            DB.Entities.SaveChanges();
        }
    }


    /// <summary>
    /// Расширение юридических лиц
    /// </summary>
    public partial class LegalEntities
    {
        /// <summary>
        /// Обновление юридического лица
        /// </summary>
        /// <param name="legalEntities">Юридическое лицо, новое состояние</param>
        /// <param name="userLogin">Логин пользователя, который делает изменение</param>
        public void Update(LegalEntities legalEntities, string userLogin)
        {
            IdUser = userLogin;
            Name = legalEntities.Name;
            NumberInSAP = legalEntities.NumberInSAP;

            DB.Entities.SaveChanges();
        }


        /// <summary>
        /// Клиентский номер клиента
        /// </summary>
        public int SequentialNumber
        {
            get
            {
                if (Customers != null) return Customers.SequentialNumber;
                return 0;
            }
        }
    }


    /// <summary>
    /// Расширение класса Contacts
    /// </summary>
    public partial class Contacts
    {
        /// <summary>
        /// Обновление контакта
        /// </summary>
        /// <param name="contacts">Контакт</param>
        /// <param name="userLogin">Логин пользователя</param>
        public void Update(Contacts contacts, string userLogin)
        {
            IdUser = userLogin;
            Name = contacts.Name;
            Position = contacts.Position;
            Phone = contacts.Phone;
            Email = contacts.Email;
            Birthday = contacts.Birthday;
            Remind = contacts.Remind;
            Comments = contacts.Comments;
            IdLegalEntity = contacts.IdLegalEntity;

            DB.Entities.SaveChanges();
        }
    }


    /// <summary>
    /// Расширение класса EquipmentTypes
    /// </summary>
    public partial class EquipmentTypes
    {
        /// <summary>
        /// Производители обородувания выбранного типа
        /// </summary>
        public List<Vendors> Vendors
        {
            get
            {
                var result = new List<Vendors>();

                foreach (Equipments equipment in Equipments)
                {
                    if (!result.Contains(equipment.Vendors)) result.Add(equipment.Vendors);
                }

                return result;
            }
        }
    }


    /// <summary>
    /// Расширение класса
    /// </summary>
    public partial class ControllersAndActions
    {
        /// <summary>
        /// Строковое значение Controller/Action
        /// </summary>
        public string ControllerAndAction
        {
            get { return Controller + " / " + Action; }
        }
    }


    /// <summary>
    /// Расширение класса
    /// </summary>
    public partial class Settlements
    {
        /// <summary>
        /// Название региона
        /// </summary>
        public string RegionName
        {
            get { return Regions.NameRu; }
        }


        /// <summary>
        /// Название области
        /// </summary>
        public string DistrictName
        {
            get { return Regions.Districts.NameRu; }
        }


        /// <summary>
        /// Название района
        /// </summary>
        public string AreaName
        {
            get
            {
                if (Areas != null) return Areas.NameRu;
                return "";
            }
        }


        /// <summary>
        /// Получить регионы в стране
        /// </summary>
        /// <param name="idCountry">Идентификатор страны</param>
        /// <returns>Регионы</returns>
        public IQueryable<Districts> GetDistrictsByCountryId(int idCountry)
        {
            return DB.DistrictsActive.Where(p => p.IdCountry == idCountry);
        }

        //public IQueryable<Regions> GetRegionsByCountryId(int idCountry)
        //{
        //    return DB.RegionsActive.Where(p=>p.id)
        //} 


        /// <summary>
        /// Страна
        /// </summary>
        public Countries Country
        {
            get { return Regions.Districts.Countries; }
        }


        /// <summary>
        /// Страна по-русски
        /// </summary>
        public string CountryRu
        {
            get { return Regions.Districts.Countries.CountryRu; }
        }

        private int _currentCountry;


        /// <summary>
        /// Идентификатор страны
        /// </summary>
        public int IdCountry
        {
            get { return Regions.Districts.Countries.IdCountry; }
        }

        private int _currentDistrict;


        /// <summary>
        /// Текущая страна
        /// </summary>
        public int CurrentCountry
        {
            get
            {
                if (_currentCountry == 0) _currentCountry = 1;
                return _currentCountry;
            }
            set { _currentCountry = value; }
        }


        /// <summary>
        /// Текущая область
        /// </summary>
        public int CurrentDistrict
        {
            get
            {
                if (_currentDistrict == 0) if (Regions.IdDistrict != null) _currentDistrict = (int)Regions.IdDistrict;
                return _currentDistrict;
            }
            set { _currentDistrict = value; }
        }


        /// <summary>
        /// Текущий регион
        /// </summary>
        public int CurrentRegion
        {
            get
            {
                if (_currentRegion == 0) _currentRegion = Regions.IdRegion;
                return _currentRegion;
            }
            set { _currentRegion = value; }
        }

        private int _currentRegion;
    }
}